package gemsa.servlets.administrateur;

import java.io.IOException;
import java.util.List;
import java.util.ArrayList;
import java.util.Enumeration;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.sql.DataSource;
import gemsa.modeles.ModeleSousAxe;
import gemsa.modeles.ModeleAxe;
import gemsa.outils.GestionDroit;
import gemsa.beans.Ssaxe;
import gemsa.beans.Axe;

/**
 * Classe ServletGestionSousAxes
 * @author Projet Dev Groupe 33
 * @version 1.0 Finale
 */

@SuppressWarnings("serial")
public class ServletGestionSousAxes extends HttpServlet 
{
	// Variables de la classe
	private DataSource datasource=null;
	private GestionDroit gestionDroit=null;
	
	// Traitements
	public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException
	{		
		// Initialisation de la gestion des droits
		gestionDroit=new GestionDroit(request);
		
		// On autorise uniquement les administrateurs
		if(gestionDroit.estAutorise(true,false,false))
		{
			// R�cup�rer l'objet datasource du context de la servlet
			datasource=(DataSource)getServletContext().getAttribute("datasource");
			
			// Action � r�aliser
			String action=(String)request.getParameter("action");
			
			// Action par d�faut (liste)
			if(action==null || action.equalsIgnoreCase(""))
			{
				action="lister";
			}
			
			// Listing des sous-axes
			if(action.equals("lister"))
			{
				lister(request,response);
			}
			
			// Consulter un sous-axe
			if(action.equals("consulter"))
			{
				consulter(request,response);
			}
			
			// Formulaire d'ajout d'un sous-axe
			if(action.equals("ajouter"))
			{
				ajouter(request,response);
			}
			
			// Validation du formulaire d'ajout
			if(action.equals("validerajout"))
			{
				validerAjout(request,response);
			}

			// Suppression d'un sous-axe
			if(action.equals("supprimer"))
			{
				supprimer(request, response);
			}
			
			// Formulaire de modification d'un sous-axe
			if(action.equals("modifier"))
			{
				modifier(request, response);
			}
			
			// Validation du formulaire de modification
			if(action.equals("validermodification"))
			{
				validerModification(request, response);
			}
		}
		else
		{
			getServletContext().getRequestDispatcher("/pageFixe?action=erreur&erreurs=Vous n'�tes pas autoris� � afficher cette page!").forward(request, response);
		}	
		
		// Vider le datasource
		this.datasource=null;
	}
	
	
	
	
	// Lister les ssaxes
	private void lister(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
	{
		// Variables
		int page=0;
		int maxParPage=0;
		ModeleSousAxe modeleSousAxe=null;
		ArrayList<Ssaxe> listeSousAxes=null;
		
		try 
		{
			// On r�cup�re la page demand�e
			page=Integer.parseInt(request.getParameter("page").trim());
			
			// Si la page vaut 0 ou inf�rieur on prend la valeur 1
			page=Math.max(page, 1);
		}
		catch (Exception e) 
		{
			// Si dans la requete l'attribut page n'est pas un nombre, on initialise la page � 1
			page=1;
		}
		
		try 
		{
			// On r�cup�re le maximum d'�l�ments a afficher
			maxParPage=Integer.parseInt(request.getParameter("maxParPage").trim());
			
			// Si maxParPage est inf�rieur � 5, on renvoie 5
			maxParPage=Math.max(maxParPage, 5);
		}
		catch (Exception e) 
		{
			// Si dans la requete le param�tre n'est pas un nombre, on initialise le maximum d'�l�ment � 20
			maxParPage=20;
		}

		// On initialise le mod�le
		modeleSousAxe=new ModeleSousAxe(datasource);
		
		// On r�cup�re la liste des ssaxes avec le mod�le
		listeSousAxes=(ArrayList<Ssaxe>)modeleSousAxe.listeSousAxeAdmin(maxParPage, page);
		
		// On renvoie � la JSP la liste des ssaxes obtenus ainsi que les informations de pagination
		request.setAttribute("listeSousAxes",listeSousAxes);
		request.setAttribute("maxParPage", modeleSousAxe.getMaxParPage());
		request.setAttribute("pageActuel", modeleSousAxe.getPageActuel());
		request.setAttribute("totalElement", modeleSousAxe.getTotalElement());
		
		// On renvoie de plus � la vue les messages d'erreurs et ou de succ�s
		request.setAttribute("succes",(String)request.getParameter("succes"));
		request.setAttribute("erreurs",(String)request.getParameter("erreurs"));
		
		// On vide la liste des ssaxes par s�curit�
		listeSousAxes=null;
		
		// On renvoie la page de listing des ssaxes
		getServletContext().getRequestDispatcher("/vues/administrateurs/listessaxes.jsp").forward(request,response);
	}
	
	
	// Consulter un sous-axe
	private void consulter(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
	{
		// Variables
		ModeleSousAxe modeleSousAxe=null;
		int idSsaxe=0;
		Ssaxe ssaxe=null;
		
		try
		{
			// On r�cup�re l'id du sous-axe
			idSsaxe=Integer.parseInt(request.getParameter("idSsaxe"));
		}
		catch (Exception e) 
		{
			// Si l'id du sous-axe pass� en param�tre n'est pas un nombre, on initialise l'id � 0
			idSsaxe=0;
		}
		
		// On initialise le mod�le
		modeleSousAxe=new ModeleSousAxe(datasource);
		
		// On r�cup�re le sous-axe correspondante, renvoie null si l'id du sous-axe n'existe pas dans la base
		ssaxe=(Ssaxe)modeleSousAxe.getSsaxe(idSsaxe);
		
		// Si l'objet sous-axe est null (id non trouv�) on renvoie sur la page de listing avec un message d'erreur
		if(ssaxe!=null)
		{
			// On renvoie � la JSP le sous-axe demand�
			request.setAttribute("ssaxe",ssaxe);
			
			// On vidu sous-axe par s�curit�
			ssaxe=null;
			
			// On renvoie � la vue de consultation des informations d'un sous-axe
			getServletContext().getRequestDispatcher("/vues/administrateurs/consulterssaxe.jsp").forward(request,response);
		}
		else
		{
			// On renvoie la page de liste des sous-axes avec un message d'erreur
			response.sendRedirect("administrationSousAxes?action=lister&erreurs=" + "Ce sous-axe n'est pas r�f�renc� dans la base");
		}
	}
	
	
	
	// Ajouter un sous-axe
	private void ajouter(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
	{
		// Variables
		List<Axe> listeAxe=null;
		ModeleAxe modeleAxe=null;
		
		// Initialisation du mod�le
		modeleAxe=new ModeleAxe(this.datasource);
		
		// On r�cup�re la liste des sous-axes depuis le mod�le
		listeAxe=modeleAxe.listeAxe();
		
		// On place dans la requ�te la liste des axes
		request.setAttribute("axes", listeAxe);
		
		// on renvoie � la vue d'ajout d'un sous-axe
		getServletContext().getRequestDispatcher("/vues/administrateurs/ajouterssaxe.jsp").forward(request,response);
	}
	
	
	// Valider l'ajout d'un sous-axe
	private void validerAjout(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
	{
		// Variables
		ModeleAxe modeleAxe=null;
		List<Axe> listeAxe=null;
		Enumeration parametres=null;
		String parametre=null;
		List<String> erreurs=null;
		String nom=null;
		
		// On r�cup�re les informations du formulaire sur lesquels on va appliquer une validation
		nom=request.getParameter("nom").trim();
		
		// On ajoute tous les attributs du formulaire dans la requ�te soit pour les transf�rer � la vue
		parametres=request.getParameterNames();
		while (parametres.hasMoreElements()) 
		{
			parametre=(String)parametres.nextElement();
		    request.setAttribute(parametre,(String)request.getParameterValues(parametre)[0]);
		}

		// Initialisation de la collection d'erreurs
		erreurs=new ArrayList<String>();
		
		// On v�rifie que le nom est renseign�
		if(nom.trim().equals("") || nom==null)
		{
			erreurs.add("Le param�tre [nom] est vide");
		}
		else if (nom.trim().length()<5)
		{
			// Test de la longeur du nom (5 caract�re minimum)
			erreurs.add("Le param�tre [nom] doit contenir au moin 5 caract�res");
		}
		else if (!nom.trim().matches("^[\\p{L}\\s\\d-']{5,}$"))
		{
			erreurs.add("Le param�tre [nom] contient une erreur de syntaxe");
		}
		
		// On regarde le nombre d'erreurs, s'il y en a au moins une on retourne � la page d'ajout
		if(erreurs.size() > 0)
		{	
			// On initialise le modele d'xe
			modeleAxe=new ModeleAxe(datasource);
			
			// On r�cup�re la liste des axes
			listeAxe=modeleAxe.listeAxe();
			
			// On place la liste dans la requ�te
			request.setAttribute("axes", listeAxe);
			
			// On ajoute la collection d'erreurs
			request.setAttribute("erreurs", erreurs);
			
			// On renvoie � la vue d'ajout d'un sous-axe
			getServletContext().getRequestDispatcher("/vues/administrateurs/ajouterssaxe.jsp").forward(request,response);
		}
	}
	
	
	// Finaliser l'ajout 
	private void finaliserajout(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
	{
		// Variables
		Ssaxe ssaxe=null;
		ModeleSousAxe modeleSousAxe=null;
		ModeleAxe modeleAxe=null;
		int codeErreur=0;
		
		// On initialise les mod�les
		modeleSousAxe=new ModeleSousAxe(this.datasource);
		modeleAxe=new ModeleAxe(this.datasource);
		
		// On initialise le nouveau sous-axe � ajouter
		ssaxe=new Ssaxe();
				
		// On d�finit les attributs du sous-axe avec les informations fournit dans les deux formulaires pr�c�dent
		ssaxe.setAxe(modeleAxe.getAxe(Integer.parseInt(request.getParameter("axe").trim())));
		ssaxe.setNom(request.getParameter("nom").trim());
		ssaxe.setDescription(request.getParameter("description").trim());
		ssaxe.setEtat(Integer.parseInt(request.getParameter("etat").trim()));
		
		// On ajoute le sous-axe � la base de donn�es en passant par le mod�le
		codeErreur=modeleSousAxe.ajouterSousAxe(ssaxe);
		
		// On vide l'objet ssaxe par s�curit�
		ssaxe=null;
			
		// On teste le code de retour pour afficher un message de succ�s ou d'erreur
		if(codeErreur!=1)
		{		
			// On renvoie � la page de liste des ssaxes avec un message d'erreur
			response.sendRedirect("administrationSousAxes?action=lister&erreurs=" + "Une erreur s'est produite durant l'ajout du sous-axe, veuillez recommencer");
		}
		else
		{	
			// On renvoie � la page de liste des ssaxes avec un message d'erreur
			response.sendRedirect("administrationSousAxes?action=lister&succes=" + "Le sous-axe � �t� ajout� avec succ�s");
		}
	}

	
	// Supprimer un sous-axe
	private void supprimer(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
	{
		// Variables
		ModeleSousAxe modeleSousAxe=null;
 		int idSsaxe=0;
		int codeErreur=0;
	
		try
		{
			// On r�cup�re l'id du sous-axe
			idSsaxe=Integer.parseInt(request.getParameter("idSsaxe"));
		}
		catch (Exception e) 
		{
			// Si l'id du sous-axe pass� en param�tre n'est pas un nombre, on initialise l'id � 0
			idSsaxe=0;
		}
		
		// On initialise le mod�le
		modeleSousAxe=new ModeleSousAxe(this.datasource);
		
		// Si le sous-axe existe on le supprime
		if(modeleSousAxe.getSsaxe(idSsaxe)!=null)
		{
			// On envoie au mod�le l'id du sous-axe � supprimer, renvoie 1 si le sous-axe a bien �t� supprim�
			codeErreur=modeleSousAxe.supprimerSousAxe(idSsaxe);
			
			// On vide l'id du sous-axe par s�curit�
			idSsaxe=0;
			
			// On teste le code de retour pour afficher un message de succes ou d'erreur
			if(codeErreur!=1)
			{		
				// On renvoie � la page de liste des ssaxes avec un message d'erreur
				response.sendRedirect("administrationSousAxes?action=lister&erreurs=" + "Une erreur s'est produite durant la suppression du sous-axe. Veuillez recommencer");
			}
			else
			{	
				// On renvoie � la page de liste des ssaxes avec un message d'erreur
				response.sendRedirect("administrationSousAxes?action=lister&succes=" + "Le sous-axe � �t� supprim� avec succ�s");
			}
		}
		else
		{
			// On renvoie � la page de liste des ssaxes avec un message d'erreur
			response.sendRedirect("administrationSousAxes?action=lister&erreurs=" + "Ce sous-axe n'est pas r�f�renc� dans la base");
		}
	}
	
	
	// Modifier un sous-axe
	private void modifier(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
	{
		// Variables
		int idSsaxe=0;
		Ssaxe ssaxe=null;
		List<Axe> liste=null;
		ModeleSousAxe modeleSousAxe=null;
		ModeleAxe modeleAxe=null;
		
		try
		{
			// On r�cup�re l'id du sous-axe
			idSsaxe=Integer.parseInt(request.getParameter("idSsaxe"));
		}
		catch (Exception e) 
		{
			// Si l'id du sous-axe pass� en param�tre n'est pas un nombre, on initialise l'id � 0
			idSsaxe=0;
		}
		
		// On initialise les mod�les
		modeleSousAxe=new ModeleSousAxe(datasource);
		modeleAxe=new ModeleAxe(datasource);
		
		// On r�cup�re le sous-axe correspondant, renvoie null si l'id du sous-axe n'existe pas dans la base
		ssaxe=(Ssaxe)modeleSousAxe.getSsaxe(idSsaxe);
		
		// Si l'objet sous-axe est null (id non trouv�) on renvoie sur la page de listing avec un message d'erreur
		if(ssaxe!=null)
		{
			// On r�cup�re la liste des axes depuis le mod�le
			liste=modeleAxe.listeAxe();
			
			// On renvoie � la vue le sous-axe � modifier
			request.setAttribute("ssaxe",ssaxe);
			
			// On place dans la requ�te la liste des axes
			request.setAttribute("axes", liste);
			
			// On vide les objets par s�curit�
			ssaxe=null;
			liste=null;
			
			// On renvoie � la vue de modification d'un sous-axe
			getServletContext().getRequestDispatcher("/vues/administrateurs/modifierssaxe.jsp").forward(request,response);
		}
		else
		{
			// On renvoie � la page de liste des ssaxes avec un message d'erreur
			response.sendRedirect("administrationSousAxes?action=lister&erreurs=" + "Cette ssaxe n'est pas r�f�renc�e dans la base");
		}
	}
	
	
	// Valider la modification d'un sous-axe
	private void validerModification(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
	{
		// Variables
		ModeleAxe modeleAxe=null;
		ModeleSousAxe modeleSousAxe=null;
		List<Axe> listeAxe=null;
		List<String> erreurs=null;
		Enumeration parametres=null;
		String parametre=null;
		String nom=null;
		Ssaxe ssaxe=null;
		int codeErreur=0;
		
		// On initialise les mod�les
		modeleAxe=new ModeleAxe(this.datasource);
		modeleSousAxe=new ModeleSousAxe(this.datasource);
		
		// On r�cup�re les informations du formualire sur lesquels on va appliquer une validation
		nom=request.getParameter("nom").trim();

		// On ajoute tous les attributs du formulaire dans la requ�te pour les transf�rer � la vue
		parametres=request.getParameterNames();
		while (parametres.hasMoreElements()) 
		{
			parametre=(String)parametres.nextElement();
		    request.setAttribute(parametre,(String)request.getParameterValues(parametre)[0]);
		}
		
		// Initialisation de la collection d'erreurs
		erreurs=new ArrayList<String>();
		
		// On v�rifie que le nom est renseign�
		if(nom.trim().equals("") || nom==null)
		{
			erreurs.add("Le param�tre [nom] est vide");
		}
		else if (nom.trim().length()<5)
		{
			// Test de la longeur du nom (5 caract�re minimum)
			erreurs.add("Le param�tre [nom] doit contenir au moin 5 caract�res");
		}
		else if (!nom.trim().matches("^[\\p{L}\\s\\d-']{5,}$"))
		{
			erreurs.add("Le param�tre [nom] contient une erreur de syntaxe");
		}
		
		// On regarde le nombre d'erreurs, s'il y en a au moins une on renvoie � la page de modification
		if(erreurs.size()>0)
		{	
			// On initialise le modele d'axe
			modeleAxe=new ModeleAxe(datasource);
			
			// On r�cup�re la liste des axes
			listeAxe=modeleAxe.listeAxe();
			
			// On place la liste dans la requ�te
			request.setAttribute("axes", listeAxe);
			
			// On ajoute la collection d'erreurs
			request.setAttribute("erreurs", erreurs);
			
			// On renvoie � la vue de modification du sous-axe
			getServletContext().getRequestDispatcher("/vues/administrateurs/modifierssaxe.jsp").forward(request,response);
		}
		// Si aucune erreur, on modifie dans la base de donn�es
		else
		{	
			// On initialise le sous-axe � modifier
			ssaxe=new Ssaxe();
					
			// On d�finit les attributs du sous-axe avec les informations des deux formulaires pr�c�dents
			ssaxe.setId(Integer.parseInt(request.getParameter("id").trim()));
			ssaxe.setAxe(modeleAxe.getAxe(Integer.parseInt(request.getParameter("axe").trim())));
			ssaxe.setNom(request.getParameter("nom").trim());
			
			// On modifie le sous-axe dans la base de donn�es en passant par le mod�le
			codeErreur=modeleSousAxe.modifierSousAxe(ssaxe);
			
			// On vide l'objet sous-axe par s�curit�
			ssaxe=null;
				
			// On teste le code de retour pour afficher un message de succ�s ou d'erreur
			if(codeErreur!=1)
			{		
				// On renvoie � la page de liste des sous-axes avec un message d'erreur
				response.sendRedirect("administrationSousAxes?action=lister&erreurs=" + "Une erreur s'est produite durant la modification du sous-axe, veuillez recommencer");
			}
			else
			{	
				// On renvoie � la page de liste des sous-axes avec un message d'erreur
				response.sendRedirect("administrationSousAxes?action=lister&succes=" + "Le sous-axe � �t� modifi� avec succ�s");
			}
		}	
	}
	
	public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException
	{
		doGet(request, response);
	}
	
	
}